package main

import (
	"log"
	"sync"
	"sync/atomic"
	"time"
)

func main() {
	var total int64 = 0
	// 控制子线程的任务执行,等同于Map/Reduce处理
	wg := &sync.WaitGroup{}
	// 统计运行时间
	ts := time.Now()
	// 启动100万个线程，每个线程执行100次加1的任务,这里使用了锁，防止脏数据
	for i := 0; i < 1000000; i++ {
		// go标记的函数，自动在一个新的线程中去执行
		go func() {
			// 控制器的执行任务＋1
			wg.Add(1)
			// 子线程结束时，控制器的执行任务完成
			defer wg.Done()
			for i := 0; i < 100; i++ {
				atomic.AddInt64(&total, 1)
			}

		}()
	}

	// 这里主线程休眠一小短时间，防止子线程的任务控制wg.Add(1)还没有触发，主线程就执行完毕
	time.Sleep(1 * time.Millisecond)

	// 等待子线程的任务完成
	wg.Wait()

	// 输出最终运行时间
	log.Printf("启动100万个线程并执行计算任务完成，总计耗时：%v(毫秒)\n", time.Now().Sub(ts).Nanoseconds()/1000000)
	// 输出最终结果
	log.Println("最终计算结果为", total)

}
